home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 13, No. 01 (1992-01)(MindCraft Publishing)(Side A).zip / Nibble Volume 13, No. 01 (1992-01)(MindCraft Publishing)(Side A).po / AMPERCIPHER.S < prev    next >
Text File  |  1996-12-24  |  4KB  |  126 lines

  1. *************************
  2. *     AMPERCIPHER       *
  3. *   by Rich Skrenta     *
  4. *  Copyright (C) 1992   *
  5. * MindCraft Publ. Corp. *
  6. *   Lincoln, MA 01773   *
  7. *************************
  8. *    Merlin Assembler   *
  9. *************************
  10. CHRGET    EQU $B1
  11. CHRGOT    EQU $B7
  12. LASTVAR   EQU $81
  13. VARPNT    EQU $83
  14. RND       EQU $C9
  15. PTRGET    EQU $DFE3
  16. CHKCOM    EQU $DEBE
  17. ERR       EQU $DEC9
  18. RANDOM    EQU $EFB4
  19. AMPER     EQU $3F5
  20. *
  21. LEN1      EQU $00
  22. LEN2      EQU $01
  23. PTR1      EQU $FC
  24. PTR2      EQU $FE
  25. *
  26.           ORG $300
  27.           LDA #$4C       ;STORE A JUMP INSTRUCTION
  28.           STA AMPER      ;TO THE CIPHER PROGRAM
  29.           LDA #<START    ;IN THE AMPERSAND
  30.           STA AMPER+1    ;VECTOR
  31.           LDA #>START
  32.           STA AMPER+2
  33.           RTS            ;RETURN TO CALLING PROGRAM
  34. *
  35. START     PHA            ;SAVE THE CHAR AFTER "&"
  36.           JSR CHRGET     ;ADVANCE TXTPTR
  37.           JSR GETSTR     ;GET THE MESSAGE STRING
  38.           STX LEN1       ;STORE LENGTH
  39.           STA PTR1       ;AND A POINTER TO THE
  40.           STY PTR1+1     ;ACTUAL STRING
  41.           JSR GETSTR     ;GET THE PASSWORD STRING
  42.           STX LEN2
  43.           STA PTR2
  44.           STY PTR2+1
  45. *
  46.           LDX #5         ;INDEX TO INIT RND SEED
  47.           LDA LEN2       ;INIT WITH PASSWORD LENGTH
  48. CLEAR     STA RND-1,X    ;STORE IN EACH FP LOC
  49.           DEX
  50.           BNE CLEAR      ;LOOP UNTIL DONE
  51. *
  52.           CLC            ;CLEAR FOR ADDITION
  53.           LDY LEN2       ;DO FOR EACH CHAR IN PASSWORD
  54.           DEY
  55. SEED      LDX #5         ;5 BYTE FP SEED
  56. SEED2     LDA (PTR2),Y   ;GET PASSWORD CHAR
  57.           ADC RND-1,X    ;ADD TO SEED BYTE
  58.           STA RND-1,X    ;STORE IT
  59.           DEC LEN2       ;NEXT PASSWORD CHAR
  60.           BEQ START4     ;BRANCH IF DONE
  61.           DEX            ;NEXT FP SEED LOCATION
  62.           BNE SEED2
  63.           BEQ SEED       ;IF MORE THAN 5 CHAR PASSWORD
  64. START4    PLA            ;GET CHAR AFTER "&"
  65.           SEC            ;FOR SUBTRACTION
  66.           SBC #'D'       ;0=DECODE,1=ENCODE
  67.           CMP #2         ;IN RANGE?
  68.           BCC SETOP      ;YES, GO TO CODER
  69. SNERR     JMP ERR        ;?SYNTAX ERROR
  70. *
  71. GETSTR    JSR CHRGOT     ;GET A CHAR
  72.           JSR CHKCOM     ;MAKE SURE IT'S ","
  73.           JSR PTRGET     ;GET A VARIABLE
  74.           LDA LASTVAR    ;TEST LETTERS OF NAME
  75.           BMI SNERR      ;TO MAKE SURE IT'S
  76.           LDA LASTVAR+1  ;A STRING VARIABLE
  77.           BPL SNERR      ;(1ST POS, 2ND NEG)
  78.           LDY #0         ;INDEX
  79.           LDA (VARPNT),Y ;GET THE LENGTH
  80.           BEQ SNERR      ;NULL STRINGS NOT ALLOWED
  81.           TAX
  82.           INY
  83.           LDA (VARPNT),Y ;GET THE ADDRESS OF THE
  84.           PHA            ;STRING
  85.           INY
  86.           LDA (VARPNT),Y
  87.           TAY
  88.           PLA
  89.           RTS            ;X=LENGTH, Y,A POINT TO STRING
  90. *
  91. SETOP     TAY            ;1=ENCODE,0=DECODE
  92.           LDA REF1,Y     ;GET THE RIGHT OPERATIONS
  93.           STA OP1        ;CLC & ADC FOR ENCODING
  94.           LDA REF2,Y     ;SEC & SBC FOR DECODING
  95.           STA OP2
  96. *
  97. CODE      LDX #1         ;THE "1" IN RND(1)
  98.           JSR RANDOM     ;FORM A RANDOM NUMBER IN FAC & RND
  99.           LDX #4         ;INDEX FOR MANTISSA
  100.           LDA #0         ;START WITH 0
  101.           CLC            ;AND ADD UP THE 4 BYTES
  102. CODE2     ADC RND,X      ;OF THE MANTISSA
  103.           DEX            ;INTO ONE BYTE
  104.           BNE CODE2      ;LOOP IF NOT DONE
  105.           AND #%00011111 ;RESTRICT RANGE TO 0-31
  106.           STA LEN2
  107.           LDY LEN1       ;INDEX FOR CODE MESSAGE
  108.           DEY
  109.           LDA (PTR1),Y   ;GET THE CHAR
  110. OP1       CLC            ;ADD OR SUBTRACT
  111. OP2       ADC LEN2       ;TO ENCODE OR DECODE THE CHAR
  112.           CMP #32        ;IN RANGE?
  113.           BCS CODE3      ;YES, LEAVE IT ALONE
  114.           CLC            ;NO, ADD SOME
  115.           ADC #94
  116. CODE3     CMP #126       ;IN RANGE?
  117.           BCC CODE4      ;YES, LEAVE ALONE
  118.           SEC            ;NO, SUBTRACT SOME
  119.           SBC #94
  120. CODE4     STA (PTR1),Y   ;PUT THE CHAR BACK
  121.           DEC LEN1       ;MOVE ON TO THE NEXT ELEMENT
  122.           BNE CODE       ;REPEAT IF NOT FINISHED
  123.           RTS            ;BACK TO BASIC
  124. REF1      DFB $38,$18    ;SEC & CLC
  125. REF2      DFB $E5,$65    ;SBC & ADC
  126.